'''
用于连接数据库的封装，并做数据库的增、删、改、查，以mysql为例
'''

import pymysql
from TongYong.Log_Info import Log
import traceback
from TongYong.Decode_dict import Decode_dict

'''
定义一个SQL连接的类
'''
class SQL_connect:
    # 定义一个魔法方法， __init__是一个构造函数，初始化类中的参数；
    def __init__(self,sql_info,data_type = 1):
        # self.sql_info = sql_info表示将传入的sql_info这个参数赋值给对象的属性变量；
        # data_type = 1表示传入的sql_info格式为字典类型；
        self.sql_info = sql_info
        self.sql_info["autocommit"] = True
        self.data_type = data_type
        self.__connect_status = False

    '''
    下面函数为定义一个私有的连接数据库的函数
    '''
    def __connect(self):
        Log.debug("开始进行数据库连接操作")
        try:
            self.__connect_begin = pymysql.connect(**self.sql_info)
            # 如果传入的sql_info是一个字典，则通过**可将字典自动解开
            Log.debug("数据库连接成功！")
        except:
            Log.error("数据库连接失败，请确认相关信息！")
            raise Exception("数据库连接出错！！！")
        self.__connect_status = True # 数据库连接状态为1，即为True

        if self.data_type != 1: # 假如传入的sql_info信息不是字典类型
            self.__course = self.__connect_begin.cursor(pymysql.cursors.DictCursor)
        else:
            self.__course = self.__connect_begin.cursor()
        Log.log_info("Mysql连接成功！！！")


    def excute_sql_yuju(self,sql_yuju):
        '''
        开始执行sql语句，传进：sql_yuju的参数
        :param sql_yuju:
        :return: 如果执行成功，则返回True；
        '''
        Log.debug("开始执行sql语句：",sql_yuju)
        try:
            self.__excute = self.__course.execute(sql_yuju)
        except:
            traceback.print_exc()
            Log.error("sql语句异常：%s"%sql_yuju)
        else:
            Log.debug("sql执行成功！")

        return True

    def fetch_one(self,fetch_one_sql):
        '''
        此函数为执行查询数据库的一个信息内容
        :param fetch_one_sql:
        :return: fetch_one_result（如果返回的是字典）；如果fetch_one_result不是字典，则调用Decode_dict()解析；
        '''
        if self.excute_sql_yuju(fetch_one_sql):
            fetch_one_result = self.__course.fetchone()
            Log.debug("查询到的sql内容为：{}",fetch_one_result)
            if type(fetch_one_result) != 1:
                return Decode_dict(fetch_one_result)
            else:
                return fetch_one_result

    def fetch_all(self,fetch_all_sql):
        '''
        此函数为执行查询数据库的一个信息内容
        :param fetch_all_sql:
        :return: fetch_all_result（如果返回的是字典）；如果fetch_all_result不是字典，则调用Decode_dict()解析；
        '''
        if self.excute_sql_yuju(fetch_all_sql):
            fetch_all_result = self.__course.fetchall()
            Log.debug("查询到的sql内容为：{}",fetch_all_result)
            if type(fetch_all_result) != 1:
                return Decode_dict(fetch_all_result)
            else:
                return fetch_all_result

    def __connect_closed_status(self):
        # 通过调用连接关闭的函数，做状态确认
        self.__connect_closed()
        Log.debug("数据库关闭成功！！！")

    def __connect_closed(self):
        '''
        对数据库连接状态的确认，进行数据库的关闭，先关闭游标连接，再关闭数据库连接；
        :return:
        '''
        if self.__connect_status:
            self.__course.close()
            self.__connect_begin.close()







